package com.storm.component

import com.storm.cache.AuthCacheManager
import org.springframework.security.access.ConfigAttribute
import org.springframework.security.web.FilterInvocation
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource
import org.springframework.util.AntPathMatcher
/**
 * 本系统默认为多角色机制角色是可以随意创建的，太多。
 * url相对固定，故使用url进行判断权限
 */
class FilterInvocationSecurityMetadataSourceCustomizer(private val authCacheManager: AuthCacheManager): FilterInvocationSecurityMetadataSource {
    //需要什么权限才能访问？
    //如果是不需要权限校验的url，直接返回空集合，意思是不需要任何权限就可以访问
    //否则返回当前访问的url，意思是，需要可以访问当前url的权限
    override fun getAttributes(any: Any): List<ConfigAttribute> {
        val request = (any as FilterInvocation).request
        val nowUrl = "${request.method.uppercase()} ${request.requestURI}"
        //如果不需要权限校验中的有与当前请求url匹配上的，返回空列表，表示不需要权限就可访问
        if (authCacheManager.getPermitAllList().flatMap { mapping ->
                mapping.method.map { "${it.uppercase()} ${mapping.path}" }
            }.any { AntPathMatcher().match(it, nowUrl) }) {
            return listOf()
        }
        //包装当前请求的url，作为权限
        return listOf(ConfigAttribute { nowUrl })
    }

    override fun getAllConfigAttributes(): MutableCollection<ConfigAttribute>? {
        return null
    }

    override fun supports(clazz: Class<*>?): Boolean {
        return true
    }
}